<?php
/**
 * crcl/base
 *
 * Copyright 2013 CRCL - André Sabosch - info@crcl.de
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

namespace crcl\base\mvc\controller;

interface IConcrete
{
  /**
   * Redirect via 301 header (moved pemanently)
   *
   * @param string  $sUrl
   */
  public function redirect($sUrl);

  /**
   * Sets command object
   * used internally  - use with care
   *
   * @param \crcl\base\mvc\ICommand $oCommand
   */
  public function setCommand(\crcl\base\mvc\ICommand $oCommand);

  /**
   * Gets command object
   *
   * @return \crcl\base\mvc\ICommand
   */
  public function getCommand();

  /**
   * This event is executed before action. Should be overriden in controller.
   */
  public function onPreAction();

  /**
   * Export value (to View)
   *
   * @param $key  Name of value
   * @param $value  Value
   */
  public function export($key, $value);

  /**
   * Imports value as Field object
   */
  public function import($key);
}

abstract class Base implements IConcrete
{
  //tested with http call
  //@codeCoverageIgnoreStart
  public function redirect($sUrl)
  {
    $this->oCommand->setStatus(\crcl\base\mvc\Response::STATUS_REDIRECT_PERMANENT);
    $this->oCommand->setHeaders(array('Location' => $sUrl));
  }
  //@codeCoverageIgnoreEnd

  public function setCommand(\crcl\base\mvc\ICommand $oCommand)
  {
    $this->oCommand = $oCommand;
  }

  public function getCommand()
  {
    return $this->oCommand;
  }

  //@codeCoverageIgnoreStart
  //not testable ;) could be overridden
  public function onPreAction()
  {
  }
  //@codeCoverageIgnoreEnd

  public function export($key, $value)
  {
    if ($value instanceof \crcl\base\structure\IField)
    {
      $value = $value->get();
    }
    $this->oCommand->addExport($key, $value);
  }

  public function import($key = \NULL)
  {
    $value = \NULL;
    $oField = \crcl\base\structure\Field::getInstance('string://');

    if (!\is_null($key))
    {
      if (isset($_POST[$key]))
      {
        $value = $_POST[$key];
      }
      else
      {
        if (isset($_GET[$key]))
        {
          $value = $_GET[$key];
        }
      }
      if (\is_null($value))
      {
        throw new Exception('Import value not found.',
          Exception::ERROR_BASE_IMPORTVALUENOTFOUND,
          array('key' => $key));
      }
      $oField->set($value);
    }

    return $oField;
  }

  /** PROTECTED ***********************************************************************************/

  protected $oCommand;
  protected $aValues = array();
}
